﻿using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Developer.Core.FrameWork.RedisExtensions.Service
{
    /*
     * Redis缓存接口
     * **/
    public interface IRedisBasketRepository
    {
        // 获取redis值
        Task<string> GetValue(string redisKey);

        // 获取实体并序列化
        Task<TEntity> Get<TEntity>(string redisKey);

        // 保存
        Task Set(string redisKey, object redisValue, TimeSpan cacheTime);

        // 判断是否存在
        Task<bool> Exists(string redisKey);

        // 移除指定key
        Task Remove(string redisKey);

        // 清楚所有
        Task Clear();

        // 根据key获取RedisValue
        Task<RedisValue[]> ListRangeAsync(string redisKey);

        // 在列表头部插入值。如果键不存在，先创建再插入值
        Task<long> ListLeftPushAsync(string redisKey, string redisValue, int db = -1);

        // 在列表尾部插入值。如果键不存在，先创建再插入值
        Task<long> ListRightPushAsync(string redisKey, string redisValue, int db = -1);

        // 在列表尾部插入数组集合。如果键不存在，先创建再插入值
        Task<long> ListRightPushAsync(string redisKey, IEnumerable<string> redisValue, int db = -1);

        // 移除并返回存储在该键列表的第一个元素  反序列化
        Task<T> ListLeftPopAsync<T>(string redisKey, int db = -1) where T : class;

        // 移除并返回存储在该键列表的最后一个元素   反序列化
        Task<T> ListRightPopAsync<T>(string redisKey, int db = -1) where T : class;

        // 移除并返回存储在该键列表的第一个元素   
        Task<string> ListLeftPopAsync(string redisKey, int db = -1);

        // 移除并返回存储在该键列表的最后一个元素   
        Task<string> ListRightPopAsync(string redisKey, int db = -1);

        // 列表长度   
        Task<long> ListLengthAsync(string redisKey, int db = -1);

        // 返回在该列表上键所对应的元素
        Task<IEnumerable<string>> ListRangeAsync(string redisKey, int db = -1);

        // 根据索引获取指定位置数据
        Task<IEnumerable<string>> ListRangeAsync(string redisKey, int start, int stop, int db = -1);

        // 删除List中的元素 并返回删除的个数
        Task<long> ListDelRangeAsync(string redisKey, string redisValue, long type = 0, int db = -1);

        // 清空List
        Task ListClearAsync(string redisKey, int db = -1);
    }
}
